{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "73bd968b-d970-4a05-94ef-4e7abf990827",
   "metadata": {},
   "source": [
    "Chapter 07\n",
    "\n",
    "# 点到直线距离\n",
    "Book_3《数学要素》 | 鸢尾花书：从加减乘除到机器学习 (第二版)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e38c788e-71dc-4d78-9bf4-4d9f68920b34",
   "metadata": {},
   "source": [
    "这段代码在二维平面上展示了一个点$A$到一条直线的垂直距离和垂足。具体来说，代码首先定义了点$A$的坐标$(-4, 6)$和直线的方程$ax + by + c = 0$，其中$a = 1$，$b = -2$，$c = -4$。根据点和直线的几何关系，代码计算点$A$到直线的垂足$H$以及垂直距离$d_{AH}$，并绘制出点$A$、垂足$H$和直线的图形。\n",
    "\n",
    "1. **计算垂足和垂直距离**：给定直线方程和点$A$的坐标，计算垂足$H$的坐标$(x_H, y_H)$和点到直线的距离。垂足$H$的坐标计算公式为：\n",
    "   $$\n",
    "   x_H = \\frac{b(bx_A - ay_A) - ac}{a^2 + b^2}\n",
    "   $$\n",
    "   $$\n",
    "   y_H = \\frac{a(-bx_A + ay_A) - bc}{a^2 + b^2}\n",
    "   $$\n",
    "   垂直距离$d_{AH}$计算公式为：\n",
    "   $$\n",
    "   d_{AH} = \\frac{|ax_A + by_A + c|}{\\sqrt{a^2 + b^2}}\n",
    "   $$\n",
    "\n",
    "2. **绘制图形**：在图中绘制点$A$和垂足$H$，并用线段将它们连接，形成一条从点$A$到直线的垂直线，直线绘制为蓝色线段。\n",
    "\n",
    "3. **图形标记和设置**：在图形中标注点$A$和$H$的坐标，绘制通过原点的基准$x$轴和$y$轴，设置坐标范围为$[-8, 8]$。为增强可读性，图形添加了浅灰色虚线网格，隐藏坐标轴边框，并确保$x$和$y$轴的比例相等。\n",
    "\n",
    "最终图形展示了点$A$、垂足$H$及其到直线的垂直关系，使得点与直线的垂直距离和几何关系清晰可见。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f9b2f599-b71f-4c46-b18c-3d8aba40a8dd",
   "metadata": {},
   "source": [
    "## 导入所需库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e137c7b7-b25f-4023-b4dd-8f7d1c0b2507",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt  # 导入matplotlib库，用于绘图\n",
    "import numpy as np  # 导入numpy库，用于数值计算"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d420bd15-84ba-4cb9-893b-e60b43c21056",
   "metadata": {},
   "source": [
    "## 自定义函数 - 计算点到直线的垂足和距离"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "2367b5a7-6ace-46db-bbec-9cad947b543c",
   "metadata": {},
   "outputs": [],
   "source": [
    "def dist(a, b, c, x_A, y_A):  # 计算点A到直线ax + by + c = 0的垂足H及距离\n",
    "    dist_AH = np.abs(a * x_A + b * y_A + c) / np.sqrt(a**2 + b**2)  # 计算垂直距离\n",
    "    x_H = (b * (b * x_A - a * y_A) - a * c) / (a**2 + b**2)  # 计算垂足H的x坐标\n",
    "    y_H = (a * (-b * x_A + a * y_A) - b * c) / (a**2 + b**2)  # 计算垂足H的y坐标\n",
    "    return x_H, y_H, dist_AH  # 返回垂足H的坐标及距离"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "27748413-449b-4db1-86ce-1c4c5bcee526",
   "metadata": {},
   "source": [
    "## 定义点A的坐标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b832dbbe-cb57-43e9-b2d1-c126ae8dc801",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_A = -4  # 点A的x坐标\n",
    "y_A = 6   # 点A的y坐标"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b2874ff8-8990-4c8e-b9d9-6a27436bd5bf",
   "metadata": {},
   "source": [
    "## 定义直线的参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "4c3bea1d-0b7d-47d7-b854-de12bfdb8203",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = 1  # 直线的参数a\n",
    "b = -2  # 直线的参数b\n",
    "c = -4  # 直线的参数c"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8381bce1-e5a0-4f64-9555-f76253cbc683",
   "metadata": {},
   "source": [
    "## 生成直线的x和y坐标数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ffedfddf-bbf9-4b70-a11f-3e7f717e3abb",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_array = np.linspace(-8, 8, 10)  # x坐标范围从-8到8，分成10个点\n",
    "y_array = -a / b * x_array - c / b  # 根据直线方程计算y坐标"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1feaf74b-6b30-4eaa-be7b-0e65e95c8c76",
   "metadata": {},
   "source": [
    "## 计算点A到直线的垂足H的坐标及距离"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "49169594-fa0e-434d-92a3-798400fa07b9",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_H, y_H, dist_AH = dist(a, b, c, x_A, y_A)  # 调用自定义函数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1085b60e-0a5f-40e1-b5e4-ec24dbaf631e",
   "metadata": {},
   "source": [
    "## 创建图形"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e07c0396-8708-49af-90ff-69cb49bda0f1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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iy7K2Pvzzz8jHA5j/vz5+PHHH/Gvf/0L8+bNw1133aVBaiAQCGDixIm49tprM/IsWrQIN954I+6++25s2LABp512GsaMGYOdO3dmnNHr9eKEE07Av//974xd9fnqq68wbdo0rFmzBkuXLkUwGMSoUaM0u/Fnp06d8MADD2DdunVYt24dRowYgfPOOw8//vijJn4AKC8vx7PPPhu9G4tWHHvssTGfwx9++EET7/79+3HqqadCkiR8+umn2Lx5Mx599NGMv2gBR2pRP/PSpUsBABMnTszY/eCDD2LevHn497//jZ9++gkPPfQQHn74YTz11FOpSzSfvEwA9u7dywCwFStWRJ87dOgQA8C++OILTX9WIBBgbdu2Zffcc0/GLkVRWMeOHdnzzz+vQbJEiouL2b/+9S8ubsYY++STT1ifPn3Yjz/+yAA0OZF3JnzwwQfMZDKxQCCgufuhhx5iXbt21dRZVlbGCgoKVL/+5JNPZtdcc03Mc3369GF33HFHhsliAcDee+89TZ0RampqGAD21VdfcfEzxljLli01+/wcPnyY9ezZky1dupQNGzaMzZgxQxPvzJkz2QknnKCJK57bb7+dDR06lIs7nhkzZrDu3buzcDicsWvcuHHsyiuvjHnuggsuYJdccknKjpwc2dW/ZZDX60UwGEzplkFqWLx4MWpra3H55Zdn7Pruu+9QVVUFs9mM/v37o3379hgzZoym31QffPBBtG7dGv369cOcOXM02133+++/Y+rUqXj55Zfhcrk0cTbEH3/8gVdffRVDhgyBJEma+w8ePIhWrVpp7lVLIBDA+vXrMWrUqJjnR40ahdWrV2cpVfocPHgQALjUNhQK4Y033oDX68XgwYM1cU6bNg3jxo3DyJEjNfHVZ+vWrejQoQO6du2KSZMmYdu2bZp4Fy9ejIEDB2LixIlo27Yt+vfvj+eee04Td30CgQBeeeUVXHnllTCZTBn7hg4dii+//BK//PILAGDTpk1YtWoVxo4dm7ok45YrKGpuGaSGMWPGsDFjxmjiev311xkA1qVLF/b222+zdevWsYsvvpi1bt2a7du3L2P/Y489xpYvX842bdrEnnvuOVZYWMiuuuqqjL3hcJidffbZ7N5772WMMVZRUcFlZHfbbbcxl8vFALBTTjmF1dbWaupnjLFff/2VtWjRgj333HOaejMZ2VVVVTEA7Ouvv455fs6cOaxXr14apPsf4DSyC4fD7JxzztF81PH9998zt9vNLBYLKygoYB9//LEm3tdff5317duX+f1+xhjTdGT3ySefsLfffpt9//330VFjUVGRJu9nu93O7HY7u/POO9l3333H5s2bxxwOB3vxxRc1SP4/Fi1axCwWC6uqqtLEFw6H2R133MFMJhOzWq3MZDKx+++/Py2HoZodz1sGpequT2VlJTObzeztt9/WJPerr77KALD58+dHX1tXV8cKCwvZvHnzNMsd4e2332YAGvyQpep+4okn2JAhQ1gwGGSMpd7s0s2+d+9etmXLFrZkyRJ26qmnsrFjxza4C0VNXaqqqliPHj2a/AKgxq1Fs1u9enXM8/fddx/r3bu3KmdD8Gp21113HSsuLmaVlZWaemVZZlu3bmXl5eXsjjvuYIWFhezHH3/MyLlz507Wtm1btnHjxuhzWja7eDweDysqKmKPPvpoxi5JktjgwYNjnrv++uvZKaeckrG7PqNGjWLjx4/XzPf666+zTp06sddff519//337KWXXmKtWrViCxcuTNlhqOnCamtrUVtb2+gyJSUl+PrrrzFq1KiYWwYBQM+ePXHVVVclPQMxVbfD4Yj++95778VTTz2FqqqqRnenper+5ptvMGLECKxcuRJDhw6N/t+gQYMwcuRIzJkzR5PcEaqqqtCpUyesWbMGgwYNUu2eNGkSPvzww5jdGaFQCBaLBZMnT8aLL76Y9LWZZN+1axc6d+6M1atXJ91tla67uroaw4cPx6BBg7Bw4cKEO3BkmnvhwoW48cYbceDAgUZfl4xAIACXy4W33noL559/fvT5GTNmYOPGjfjqq6/SdjaEyWTCe++9hwkTJmjmvP766/H+++9jxYoV6Nq1q2beZIwcORLdu3fH/PnzVTvef/99nH/++dG7lgNH3s+RO7XXv6O5Vpx11lno0aMH5s6dm5GnuLgYZ511Fp5//vnoc3PnzsV9992HqqqqTGMCAHbs2IFu3brh3XffxXnnnaeJs3Pnzrjjjjtizuy877778Morr+Dnn39OyZHVW/xoDc9bBqXqjsAYQ1lZGS677LImjxul6h4wYADsdju2bNkSbXaKomD79u0oLi7WJHd9NmzYAABo3759Ru4nn3wS9913X/Tf1dXVGD16NBYtWpS0iabrT0bkO5wsyxm7q6qqMHz4cAwYMABlZWWNNrp03Vpgs9kwYMAALF26NKbZLV26VLONDQ8YY7j++uvx3nvvYfny5dwbXeRnNvSeSJUzzzwz4ezIK664An369MHtt9+ueaOTZRk//fQTTjvttIxdp556asLlHb/88kuD2w81lJWVoW3btprekcbn8yV87iwWS3q3eNNsnCkQe/fuZa1bt2YXXHAB27hxI9uyZQu75ZZbmCRJMbsmMuGLL75gANjmzZs18UWYMWMG69ixI/v888/Zzz//zK666irWtm1b9scff2TkXb16NXvsscfYhg0b2LZt29iiRYtYhw4d2LnnnqtR8v+h9TG7b7/9lj311FNsw4YNbPv27WzZsmVs6NChrHv37qyuri4jd2TX5YgRI9iuXbvY7t27ow8t2LFjB9uwYQObPXs2y8vLYxs2bGAbNmxghw8fTsvzxhtvMEmS2IIFC9jmzZvZjTfeyNxuN9u+fXvGGQ8fPhzNBSD6PtmxY0dG3muvvZYVFBSw5cuXx9TV5/NlnJkxxu688062YsUKVlFRwb7//nt21113MbPZzJYsWaKJvz5a7sb829/+xpYvX862bdvG1qxZw8aPH8/y8/M1WZdr165lVquVzZkzh23dupW9+uqrzOVysVdeeUWD5IyFQiHWpUsXdvvtt2viizBlyhTWsWNH9tFHH7GKigr27rvvssLCQnbbbbel7MjJZscYY+Xl5WzUqFGsVatWLD8/n51yyinsk08+0cx/8cUXsyFDhmjmixAIBNjf/vY31rZtW5afn89GjhzJ/vvf/2bsXb9+PRs0aBArKChgDoeD9e7dm82cOZN5vV4NUseidbP7/vvv2fDhw1mrVq2Y3W5nJSUl7JprrmG7du3K2F1WVtbgcTctmDJlSlL3f/7zn7RdTz/9NCsuLmY2m42deOKJmp3C/5///CdpxilTpmTkbaiuZWVlmuS+8soro/Vo06YNO/PMM7k0Osa0bXZ//vOfWfv27ZkkSaxDhw7sggsuyPg4Y30+/PBD1rdvX2a321mfPn3Ys88+q5n7888/ZwDYli1bNHMyduTSsBkzZrAuXbowh8PBunXrxu6++24my3LKDkMdsyMIgiCIZOTkdXYEQRBEbkHNjiAIgjA81OwIgiAIw0PNjiAIgjA81OwIgiAIw0PNjiAIgjA81OwIgiAIw0PNjiAIgjA81OwIgiAIw0PNjiAIgjA81OwIQnD27t2Ldu3a4f77748+9+2338Jms2HJkiVZTEYQ+oHmxiQIA/DJJ59gwoQJWL16Nfr06YP+/ftj3LhxePzxx7MdjSB0ATU7gjAI06ZNwxdffIGTTjoJmzZtQnl5edIb2xJELkLNjiAMgt/vR9++fVFZWYl169bh+OOPz3YkgtANdMyOIAzCtm3bUF1djXA4jB07dmQ7DkHoChrZEYQBCAQCOPnkk9GvXz/06dMHjz32GH744QcUFRVlOxpB6AJqdgRhAG699Va8/fbb2LRpE/Ly8jB8+HDk5+fjo48+ynY0gtAFtBuTIARn+fLlePzxx/Hyyy+jRYsWMJvNePnll7Fq1SrMnTs32/EIQhfQyI4gCIIwPDSyIwiCIAwPNTuCIAjC8FCzIwiCIAwPNTuCIAjC8FCzIwiCIAwPNTuCIAjC8FCzIwiCIAwPNTuCIAjC8FCzIwiCIAwPNTuCIAjC8FCzIwiCIAwPNTuCIAjC8Pw/7mfSeTE14nUAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()  # 创建图形和坐标轴对象\n",
    "\n",
    "## 绘制直线和点A、垂足H\n",
    "plt.plot(x_array, y_array)  # 绘制直线\n",
    "plt.plot(x_A, y_A, 'x', markersize=12)  # 绘制点A\n",
    "plt.plot(x_H, y_H, 'x', markersize=12)  # 绘制垂足H\n",
    "\n",
    "## 绘制点A和垂足H之间的垂直线\n",
    "x_points = [x_A, x_H]  # x坐标数组\n",
    "y_points = [y_A, y_H]  # y坐标数组\n",
    "plt.plot(x_points, y_points)  # 绘制垂线\n",
    "\n",
    "## 标记点A和垂足H\n",
    "labels = ['A', 'H']  # 定义标签列表\n",
    "plt.plot(x_points, y_points, 'x')  # 绘制标记\n",
    "for label, i, j in zip(labels, x_points, y_points):\n",
    "    plt.text(i, j + 0.5, label + ' ({}, {})'.format(i, j))  # 添加坐标标签\n",
    "\n",
    "## 设置坐标轴标签和刻度\n",
    "plt.xlabel('x')  # 设置x轴标签\n",
    "plt.ylabel('y')  # 设置y轴标签\n",
    "plt.axhline(y=0, color='k', linestyle='-')  # 绘制y=0的水平线\n",
    "plt.axvline(x=0, color='k', linestyle='-')  # 绘制x=0的垂直线\n",
    "plt.xticks(np.arange(-8, 9, step=1))  # 设置x轴刻度范围和步长\n",
    "plt.yticks(np.arange(-8, 9, step=1))  # 设置y轴刻度范围和步长\n",
    "plt.axis('scaled')  # 设置坐标轴比例，使x和y轴单位长度一致\n",
    "\n",
    "## 设置坐标轴范围和样式\n",
    "ax.set_xlim(-8, 8)  # 设置x轴的显示范围为-8到8\n",
    "ax.set_ylim(-8, 8)  # 设置y轴的显示范围为-8到8\n",
    "ax.spines['top'].set_visible(False)  # 隐藏顶部边框\n",
    "ax.spines['right'].set_visible(False)  # 隐藏右侧边框\n",
    "ax.spines['bottom'].set_visible(False)  # 隐藏底部边框\n",
    "ax.spines['left'].set_visible(False)  # 隐藏左侧边框\n",
    "\n",
    "## 添加网格\n",
    "ax.grid(linestyle='--', linewidth=0.25, color=[0.5, 0.5, 0.5])  # 添加虚线网格"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
